#include <stdio.h>
#include "memp.h"
#include "printf.h"

#define MEM_ALIGNMENT                    4			/*n个字节对齐*/
#define MEM_ALIGN_SIZE(size) 			(((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
#define MEM_ALIGN(addr) 				((void *)(((unsigned int)(addr) + MEM_ALIGNMENT - 1) & ~(unsigned int)(MEM_ALIGNMENT-1)))

/*各种内存类型的单个内存块的大小*/
const unsigned int memp_sizes[MEMP_MAX] =
{
	#define   MEMPOOL(name, num, size, desc)		(size),
	#include  "memp_std.h"
};

/*各种内存类型的内存块数量*/
const unsigned int memp_num[MEMP_MAX] =
{
	#define   MEMPOOL(name, num, size, desc)		(num),
	#include  "memp_std.h"
};

/*内存池*/
static unsigned char memp_memory[
	#define		MEMPOOL(name, num, size, desc)   + ((num)*(size))
	#include 	"memp_std.h"
];


struct memp
{
	struct memp *next;
};

static struct memp *memp_tab[MEMP_MAX];

/*
	内存池初始化
*/
void memp_init(void)
{
	struct memp *memp;
	unsigned short i,j;
	
	#ifdef 	__PRINTF_H__
	user_debug("memp_memory start addr is %d\n",memp_memory);
	#endif
	//memp = (struct memp *)memp_memory;
	memp = MEM_ALIGN(memp_memory);			//将内存其实空间进行对齐
	
	#ifdef 	__PRINTF_H__
	user_debug("memp start addr is %d\n",memp);
	#endif
	for(i = 0; i < MEMP_MAX; i++)			//将每种类型的POOL进行操作
	{
		memp_tab[i] = NULL;					// 初始指针为空
		for(j = 0; j < memp_num[i]; j++)	// 将该类所有POOL组成链表形式
		{
			memp->next = memp_tab[i];
			memp_tab[i] = memp;			
			memp = (struct memp *)((unsigned char *)memp + memp_sizes[i]);
		}
	}
}

/*
	内存块申请
*/
void *memp_malloc(memp_t type)
{
	struct memp *memp;
	memp = memp_tab[type];
	#ifdef 	__PRINTF_H__
	user_debug("memp malloc addr is %d\n",memp);
	#endif
	if(memp != NULL)
	{
		memp_tab[type] = memp->next;
		memp = (struct memp *)(memp);
	}
	else
	{
		#ifdef 	__PRINTF_H__
		user_error("fail\n");
		#endif
	}
	
	return memp;
}

/*
	内存块释放
*/
void memp_free(memp_t type, void* mem)
{
	struct memp *memp;
	if(mem == NULL)		return;
	
	memp = (struct memp *)mem;
	memp->next = memp_tab[type];
	memp_tab[type] = memp;
	
	#ifdef 	__PRINTF_H__
	user_debug("memp free addr is %d\n", memp_tab[type]);
	#endif
}



